package net.xuzhen97.distributed.transaction.order.service.executor;

import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;

/**
 * rocketmq 事务消息执行器接口
 * @author xuzhen97
 * @param <T> 执行cmd
 * @param <R> prepare 预处理阶段返回值
 */
public interface IRocketMqTransactionExe<T,R> {

    /**
     * 指令执行预处理阶段，发送半消息
     * @param cmd
     * @return
     */
    R prepare(T cmd);

    /**
     * 本地事务提交
     * @param cmd 具体执行指令
     * @param trxId 事务id
     * @return
     */
    RocketMQLocalTransactionState commit(T cmd, String trxId);

    /**
     * 检查事务执行情况
     * @param trxId
     * @return
     */
    RocketMQLocalTransactionState check(String trxId);

    /**
     * 业务回滚
     * @param trxId 事务id
     */
    void rollback(String trxId);

    /**
     * 执行器业务标识
     * @return
     */
    String getBusinessId();
}
